﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    函数 gl.gaus_int
    计算多重积分的高斯法
    s(double [],double [],int,int)计算各层积分上下限（要求所有的上限>下限）的函数名。
    f(double[], int)计算被积函数值f(X)的函数名。
    double gaus_int(int n, int js[], void (*s)(), double (*f)(int,double []))
    参数 n: 积分重数。
    参数 js: js[n] js[k]表示第k层积分区间所划分的子区间个数。
    返回值 函数返回积分值。
    */

    public static unsafe string drive_gaus_int()
    {
        int[] js = new int[3] { 4, 4, 4 };
        double s;

        gl.s_xa_ya_mn = gauss;
        gl.f_xa_n = gausf;
        s = gl.gaus_int(3, js);
        //; // cout <<"s = " <<s <<endl;
        return s + "";
    }

    // 计算各层积分上下限
    private static unsafe double gauss(double* x, double* y, int j, int n)
    {
        double q;
        //n = n;
        switch (j)
        {
            case 0:
                {
                    y[0] = 0.0;
                    y[1] = 1.0;
                    break;
                }
            case 1:
                {
                    y[0] = 0.0;
                    y[1] = Math.Sqrt(1.0 - x[0] * x[0]);
                    break;
                }
            case 2:
                {
                    q = x[0] * x[0] + x[1] * x[1];
                    y[0] = Math.Sqrt(q);
                    y[1] = Math.Sqrt(2.0 - q);
                    break;
                }
            default:
                {
                    break;
                }
        }
        return 0;
    }

    // 计算被积函数值
    private static unsafe double gausf(double* x, int n)
    {
        double z;
        //n = n;
        z = x[2] * x[2];
        return (z);
    }
}